home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine CD 1995 / Archive Magazine CD 1995.iso / discs / utilities / utility_04 / jfif / !JFIF / c / RunImage
Encoding:
Text File  |  1993-06-26  |  6.5 KB  |  248 lines

  1. /*
  2.  * Module:        RunImage.c
  3.  * Creation:      29th May, 1993.
  4.  * Last modified: 26th June, 1993.
  5.  *
  6.  * (c) Copyright Neil Hoggarth, 1993.
  7.  *
  8.  * This text file is ANSI C source code.
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 1, or (at your option)
  13.  *  any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <math.h>
  29.  
  30. #include "baricon.h"  /* Icon bar stuff from RISC_OSlib */
  31. #include "dbox.h"     /* Dialogue box stuff from RISC_OSlib */
  32. #include "event.h"    /* WIMP events from RISC_OSlib */
  33. #include "menu.h"     /* Menu handling from RISC_OSlib */
  34. #include "res.h"      /* Resources from you know where */
  35. #include "resspr.h"   /* Something to do with sprites I think */
  36. #include "saveas.h"   /* File handling by icon drags from RISC_OSlib */
  37. #include "template.h" /* Template routines from RISC_OSlib */
  38. #include "visdelay.h" /* Hourglass functions from RISC_OSlib */
  39. #include "werr.h"     /* RISC_OSlib WIMP error box */
  40. #include "win.h"      /* WIMP stuff from RISC_OSlib */
  41. #include "wimpt.h"    /*            ditto           */
  42. #include "xferrecv.h" /* File handling by icon drags from RISC_OSlib */
  43.  
  44. /*
  45.  * A suggestion to Acorn for the next compiler release. The above is
  46.  * ridiculous! Why can't we just have a "riscos.h" header and be done
  47.  * with it? It would save me some typing anyway.
  48.  */
  49.  
  50. /******************************** Constants *****************************/
  51.  
  52. enum {IM_INFO=1,IM_OPTIONS,IM_SAVE,IM_QUIT};     /* Icon bar menu items */
  53. #define SPRITE_FILETYPE 0xff9
  54. #define JFIF_FILETYPE   0xc85
  55.  
  56. /***************************** Global Variables *************************/
  57.  
  58. static int finished=FALSE;
  59. static char option_q[12];
  60. static char option_mode[12];
  61.  
  62. /*************************** Function Definitions ***********************/
  63.  
  64. static menu MenuMaker(void *handle)
  65. /*
  66.  * Builds the icon bar menu.
  67.  */
  68. {
  69.   menu temp;
  70.  
  71.   handle=handle; /* Supresses a compiler warning. */
  72.  
  73.   temp=menu_new("JFIF",">Info,>Options,Save Options,Quit");
  74.   return(temp);
  75. }
  76.  
  77. static void MenuProc(void *handle, char *hit)
  78. /*
  79.  * Handles choices from the icon bar menu.
  80.  */
  81. {
  82.   dbox i;
  83.   FILE *stream;
  84.  
  85.   handle=handle; /* Supresses a compiler warning */
  86.  
  87.   switch(hit[0])
  88.   {
  89.     case IM_INFO:
  90.       i=dbox_new("progInfo");
  91.       dbox_showstatic(i);
  92.       dbox_fillin(i);
  93.       dbox_dispose(&i);
  94.       break;
  95.     case IM_OPTIONS:
  96.       i=dbox_new("options");
  97.       dbox_setfield(i,1,option_q);
  98.       dbox_setfield(i,3,option_mode);
  99.       dbox_showstatic(i);
  100.       dbox_fillin(i);
  101.       dbox_getfield(i,1,option_q,12);
  102.       dbox_getfield(i,3,option_mode,12);
  103.       dbox_dispose(&i);
  104.       break;
  105.     case IM_SAVE:
  106.       stream=fopen("<jfif$dir>.options","w");
  107.       if (stream==NULL)
  108.       {
  109.         werr(FALSE,"Can't open options file for writting. Check that the disc or filesystem is not write protected.");
  110.       }
  111.       else
  112.       {
  113.         fprintf(stream,"%s\n%s\n",option_q,option_mode);
  114.         fclose(stream);
  115.       }
  116.       break;
  117.     case IM_QUIT:
  118.       finished=TRUE;
  119.       break;
  120.   }
  121.   return;
  122. }
  123.  
  124. static BOOL sprite_to_jfif(char *output_file,void *handle)
  125. {
  126.   char *input_file;
  127.   char cmd[256];
  128.  
  129.   input_file=handle;
  130.   sprintf(cmd,"<changefsi$dir>.changefsi %s <wimp$scrapdir>.pbm p6 -nomode",input_file);
  131.   wimp_starttask(cmd);
  132.   sprintf(cmd,"<changefsi$dir>.cjpeg -Q %s <wimp$scrapdir>.pbm %s",option_q,output_file);
  133.   wimp_starttask(cmd);
  134.   sprintf(cmd,"delete <wimp$scrapdir>.pbm");
  135.   wimp_starttask(cmd);
  136.   sprintf(cmd,"settype %s %x",output_file,JFIF_FILETYPE);
  137.   wimp_starttask(cmd);
  138.   return(TRUE);
  139. }
  140.  
  141. static BOOL jfif_to_sprite(char *output_file,void *handle)
  142. {
  143.   char *input_file;
  144.   char cmd[256];
  145.  
  146.   input_file=handle;
  147.   sprintf(cmd,"<changefsi$dir>.djpeg %s <wimp$scrapdir>.pbm",input_file);
  148.   wimp_starttask(cmd);
  149.   sprintf(cmd,"<changefsi$dir>.changefsi <wimp$scrapdir>.pbm %s %s -nomode",output_file,option_mode);
  150.   wimp_starttask(cmd);
  151.   sprintf(cmd,"delete <wimp$scrapdir>.pbm");
  152.   wimp_starttask(cmd);  
  153.   return(TRUE);
  154. }
  155.  
  156. static void EventHandler(wimp_eventstr *e,void *handle)
  157. /*
  158.  * This is the event handler for the sprite on the icon bar.
  159.  */
  160. {
  161.   char *filename;
  162.   static char *input_file;
  163.   int filetype;
  164.  
  165.   handle=handle; /* This line prevents a compiler warning. */
  166.    
  167.   switch (e->e)
  168.   {
  169.     case wimp_EREDRAW:
  170.       (void)wimpt_checkmode();
  171.       break;
  172.     case wimp_ESEND:
  173.     case wimp_ESENDWANTACK:
  174.       if ( e->data.msg.hdr.action==wimp_MDATALOAD )
  175.       {
  176.         filetype=xferrecv_checkinsert(&filename);
  177.         input_file=(char *)malloc(sizeof(char)*(strlen(filename)+1));
  178.         strcpy(input_file,filename);
  179.         if (filetype==SPRITE_FILETYPE)
  180.           saveas(JFIF_FILETYPE,"JPEG",0,sprite_to_jfif,0,0,input_file);
  181.         else
  182.           saveas(SPRITE_FILETYPE,"sprite",0,jfif_to_sprite,0,0,input_file);
  183.         free(input_file);
  184.       }
  185.       break;
  186.     default:
  187.       /*
  188.        * It's not an event that we wish to respond to,
  189.        * therefore we ignore it.
  190.        */
  191.       break;
  192.   }
  193. }
  194.  
  195. static void Init(void)
  196. /*
  197.  * Declare the program as a WIMP task and initialise all the RISC_OSlib
  198.  * stuff.
  199.  */
  200. {
  201.   wimpt_init("JFIF");
  202.   res_init("JFIF");
  203.   resspr_init();
  204.   template_init();
  205.   dbox_init();
  206.   visdelay_init();
  207.  
  208.   return;
  209. }
  210.  
  211. static void LoadOptions(void)
  212. {
  213.   FILE *stream;
  214.  
  215.   stream=fopen("<jfif$dir>.options","r");
  216.   if (stream==NULL)
  217.   {
  218.     werr(FALSE,"Can't open options file for reading - using default values");
  219.     strcpy(option_q,"75");
  220.     strcpy(option_mode,"21");
  221.   }
  222.   else
  223.   {
  224.     fscanf(stream,"%s",option_q);
  225.     fscanf(stream,"%s",option_mode);
  226.     fclose(stream);
  227.   }
  228.   return;
  229. }
  230.  
  231. /****************************** Main Program ****************************/
  232.  
  233. int main(void)
  234. {
  235.   Init();
  236.  
  237.   baricon("!jfif", (int)resspr_area(), 0);
  238.   win_register_event_handler(win_ICONBAR, EventHandler, 0);
  239.   event_attachmenumaker(win_ICONBAR, MenuMaker, MenuProc, 0);
  240.   win_claim_unknown_events(win_ICONBAR);
  241.   xfersend_close_on_xfer(TRUE,win_ICONBAR);
  242.  
  243.   LoadOptions();
  244.  
  245.   while(!finished)
  246.     event_process();
  247. }
  248.